#-*- codeing = utf-8 -*-
#@Time : 2020/10/18 16:00
#@Author : 阳某
#@File : grouped分组统计.py
#@Software : PyCharm

'''
Pandas怎样实现groupby分组统计
类似SQL：
select city,max(temperature) from city_weather group by city;

groupby：先对数据分组，然后在每个分组上应用聚合函数、转换函数

本次演示：
一、分组使用聚合函数做数据统计
二、遍历groupby的结果理解执行流程
三、实例分组探索天气数据
'''
import pandas as pd
import numpy as np
# 加上这一句，能在jupyter notebook展示matplot图表
# %matplotlib inline
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
                   'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C': np.random.randn(8),
                   'D': np.random.randn(8)})
print(df)
# 一、分组使用聚合函数做数据统计
# 1、单个列groupby，查询所有数据列的统计
# 我们看到：
# groupby中的'A'变成了数据的索引列
# 因为要统计sum，但B列不是数字，所以被自动忽略掉
print(df.groupby('A').sum())
#2、多个列groupby，查询所有数据列的统计
print(df.groupby(['A','B']).mean()) #我们看到：('A','B')成对变成了二级索引

print(df.groupby(['A','B'], as_index=False).mean())

# 3、同时查看多种数据统计
print(df.groupby('A').agg([np.sum,np.mean,np.std])) #列变成了多级索引

# 4、查看单列的结果数据统计
# 方法1：预过滤，性能更好
print(df.groupby('A')['C'].agg([np.sum,np.mean,np.std]))
# 方法2
print(df.groupby('A').agg([np.sum,np.mean,np.std])['C'])

# 5、不同列使用不同的聚合函数
print(df.groupby('A').agg({"C":np.sum, "D":np.mean}))

# 二、遍历groupby的结果理解执行流程
# for循环可以直接遍历每个group
# 1、遍历单个列聚合的分组
g = df.groupby('A')
print(g)
for name,group in g:
    print(name)
    print(group)
    print('**********')

# 获取单个分组的数据
print(g.get_group('bar'))

# 2.遍历多个列聚合的分组
g = df.groupby(['A', 'B'])
for name,group in g:
    print(name) #name是一个2个元素的tuple，代表不同的列
    print(group)
    print('++++++++++++++++')

g.get_group(('foo','one'))

# 可以直接查询group后的某几列，生成Series或者子DataFrame
print(g['C'])
for name, group in g['C']:
    print(name)
    print(group)
    print(type(group))
    print('---------------')

# 三、实例分组探索天气数据
df = pd.read_csv('./files/beijing_tianqi_2018.csv')
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
df.head()
# 新增一列为月份
df['month'] = df['ymd'].str[:7]
print(df.head())
# 1、查看每个月的最高温度
data = df.groupby('month')['bWendu'].max()

print(data)
print(type(data))
print(df.groupby('month')['bWendu'])
print(df.groupby('month'))
from matplotlib import pyplot as plt
_x = data.index
_y = data.values
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x)
# plt.show()
# 2、查看每个月的最高温度、最低温度、平均空气质量指数
print(df.head())
group_data = df.groupby('month').agg({"bWendu":np.max, "yWendu":np.min, "aqi":np.mean})
print(group_data)
print(group_data.values,type(group_data))
_x = group_data.index
_y_bWendu = group_data.values[:,0]
_y_yWendu = group_data.values[:,1]
_y_aqi = group_data.values[:,2]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y_bWendu,label = '_y_bWendu')
plt.plot(range(len(_x)),_y_yWendu,label = '_y_yWendu')
plt.plot(range(len(_x)),_y_aqi,label = '_y_aqi')
plt.xticks(range(len(_x)),_x)
plt.legend(loc = 'best')
# plt.show()
